/**
 * @addtogroup brd_partition
 * brd_partition
 * @{
 */
/**
 * @file brd_partition.h
 * @brief 用于分区表的读取等
 * @par 修改日志
 * <table>
 * <tr><th>Date <th>Version <th>Author <th>Description
 * <tr><td>2020-12-08 <td>1.0 <td>软件工程院 <td>创建初始版本
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */

#ifndef _BRD_PARTITION_H_
#define _BRD_PARTITION_H_

#include <ofc_types.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * 分区表项的定义
 */
struct Brd_TPartitionItemTag
{
    char name[12];                          ///< 名称
    UInt32 offset;                          ///< 相对于flash起始地址的偏移
    UInt32 size;                            ///< 大小
    Byte id;                                ///< 参见[brd_def.h](@ref Brd_TPartitionId)
    Byte flag;                              ///< 未使用
    Byte part_type;                         ///< 未使用
    Byte reserved;                          ///< 未使用
    Int32 param1;                           ///< 未使用
    Int32 param2;                           ///< 未使用
};
typedef struct Brd_TPartitionItemTag Brd_TPartitionItem;

/// boot版本号, 适用于boot1, boot2
struct Brd_TPartitionVersionTag
{
    UInt8 tag[4];  ///< 标识符, 固定位tag[4] = {'@', 'v', '0', '1'}
    UInt8 ver[4];  ///< 主版本.次版本.修订版本.编译版本
    UInt32 build_time;  ///< 编译时间戳(UTC) 1970-1-1
};
typedef struct Brd_TPartitionVersionTag Brd_TPartitionVersion;

/**
 * 设置分区表地址
 * @details Pta: partition table address
 * @param offset: 分区表的偏移地址
 * @return 当返回值 >= 0 时, 表示设置成功 \n
 *         当返回值 < 0 时, 表示设置失败参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_PartitionSetPta(UInt32 offset);

/**
 * 返回分区个数
 * @return 返回分区个数
 */
Int32 Brd_PartitionCount(void);

/**
 * 获取索引为index的分区条目
 * @param index: 分区条目索引,从0开始
 * @return 返回分区条目信息,index超出范围返回NULL
 */
const Brd_TPartitionItem *Brd_PartitionGetItem(Int32 index);

/**
 * 通过分区类型标识, 获取分区条目
 * @param id: 分区标识, 参加[brd_def.h](@ref Brd_TPartitionIdTag)
 * @return 返回分区条目信息,如果没有找到返回NULL
 */
const Brd_TPartitionItem *Brd_PartitionQueryItem(Int32 id);

/**
 * 获取分区所在的位置(如果分区表不存在,则使用默认的地址值)
 * @param id: 分区标识, 参加[brd_def.h](@ref Brd_TPartitionIdTag)
 * @param start_addr: 起始地址,返回得到的起始地址
 * @return 当返回值 >= 0 时, 表示读取成功 \n
 *         当返回值 < 0 时, 表示读取失败参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_PartitionStartAddr(Int32 id, UInt32 *start_addr);

/**
 * 获取可执行分区的版本信息
 * @param id: 分区标识, 参加[brd_def.h](@ref Brd_TPartitionIdTag)
 * @param version: 版本信息,返回得到的版本信息
 * @return 当返回值 >= 0 时, 表示读取成功 \n
 *         当返回值 < 0 时, 表示读取失败参见[brd_def](@ref Brd_TErrorCodeTag)
 */
Int32 Brd_PartitionExecVer(Int32 id, Brd_TPartitionVersion *version);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif // _BRD_PARTITION_H_
/**
 * @} 
 */
